home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / KBDCTRL.I < prev    next >
Encoding:
Modula Implementation  |  1992-02-14  |  7.4 KB  |  289 lines

  1. IMPLEMENTATION MODULE KbdCtrl;
  2. (*$Y+,C-,N+,L-*)
  3.  
  4. (*
  5.   17.07.90: Look/Get/PushKey-Routinen korrigiert bzgl. Supexec-Aufruf
  6.   04.11.90: Supervisor-Modus ganz raus bei allen Kbd-Puffer-Zugriffen.
  7.             Allerdings können dadurch die Interrupts nicht mehr gesperrt
  8.             werden!
  9.   14.02.92 TT  GEMDOS.Super-Aufrufe statt Supexec wg. MinT.
  10. *)
  11.  
  12. FROM SYSTEM IMPORT ASSEMBLER;
  13. FROM SYSTEM IMPORT ADDRESS, ADR, TSIZE, BYTE, WORD, LONGWORD;
  14. FROM SysUtil2 IMPORT EnterSupervisorMode, LeaveSupervisorMode;
  15. FROM ResCtrl IMPORT RemovalCarrier, CatchRemoval;
  16. FROM MOSGlobals IMPORT MemArea, Key, CtrlKey, CtrlSet;
  17. FROM MOSSupport IMPORT ToSuper, ToUser;
  18.  
  19. VAR remc: RemovalCarrier;
  20.  
  21. TYPE KbdRecT= RECORD
  22.                 buf:  ADDRESS;
  23.                 size: CARDINAL;
  24.                 head: CARDINAL;      (* hiernach steht die nächste Taste an *)
  25.                 tail: CARDINAL;      (* hier hinter kommt nächste Taste rein *)
  26.               END;
  27.  
  28. PROCEDURE KeysAvail (): CARDINAL;
  29.   BEGIN
  30.     ASSEMBLER
  31.         MOVE.L  KbdRec,A0
  32.         MOVE    KbdRecT.tail(A0),D0
  33.         SUB     KbdRecT.head(A0),D0
  34.         BCC     e
  35.         ADD     KbdRecT.size(A0),D0
  36.      e: LSR     #2,D0           ; DIV 4
  37.         MOVE    D0,(A3)+
  38.     END
  39.   END KeysAvail;
  40.  
  41. PROCEDURE KeyBufferSize (): CARDINAL;
  42.   BEGIN
  43.     ASSEMBLER
  44.         MOVE.L  KbdRec,A0
  45.         MOVE    KbdRecT.size(A0),D0
  46.         LSR     #2,D0           ; DIV 4
  47.         MOVE    D0,(A3)+
  48.     END
  49.   END KeyBufferSize;
  50.  
  51. PROCEDURE asn;
  52.   BEGIN
  53.     ASSEMBLER
  54.         MOVE.B  D0,Key.ch(A2)
  55.         SWAP    D0
  56.         CLR     D1
  57.         MOVE.B  D0,D1
  58.         MOVE    D1,Key.scan(A2)
  59.         LSR     #8,D0
  60.         LSR     #1,D0
  61.         BCC     n
  62.         BSET    #0,D0
  63.      n: ANDI    #1111%,D0
  64.         MOVE.B  D0,Key.ctrl(A2)
  65.     END
  66.   END asn;
  67.  
  68. PROCEDURE LookMostRecentKey ( VAR k: Key; VAR ok: BOOLEAN );
  69.   BEGIN
  70.     ASSEMBLER
  71.         MOVE.L  -(A3),A1        ; ok
  72.         MOVE.L  -(A3),A2        ; k
  73.         MOVE.L  KbdRec,A0
  74.         MOVE    KbdRecT.tail(A0),D0
  75.         CMP     KbdRecT.head(A0),D0
  76.         BEQ     n
  77.         MOVE.L  KbdRecT.buf(A0),A0
  78.         MOVE.L  0(A0,D0.W),D0
  79.         MOVE    #1,(A1)
  80.         JMP     asn
  81.      n: CLR.L   (A2)
  82.         CLR     (A1)
  83.     END
  84.   END LookMostRecentKey;
  85.  
  86. PROCEDURE LookKey (VAR k: Key; VAR ok: BOOLEAN);
  87.   BEGIN
  88.     ASSEMBLER
  89.         MOVE.L  -(A3),A1        ; ok
  90.         MOVE.L  -(A3),A2        ; k
  91.         MOVE.L  KbdRec,A0
  92.         MOVE    KbdRecT.head(A0),D0
  93.         CMP     KbdRecT.tail(A0),D0
  94.         BEQ     n
  95.         MOVE.L  KbdRecT.buf(A0),A0
  96.         MOVE.L  4(A0,D0.W),D0
  97.         MOVE    #1,(A1)
  98.         JMP     asn
  99.      n: CLR.L   (A2)
  100.         CLR     (A1)
  101.     END
  102.   END LookKey;
  103.  
  104. PROCEDURE GetKey (VAR k: Key; VAR ok: BOOLEAN);
  105.   BEGIN
  106.     ASSEMBLER
  107.         MOVE.L  -(A3),A1        ; ok
  108.         MOVE.L  -(A3),A2        ; k
  109.         MOVE.L  KbdRec,A0
  110.         MOVE    KbdRecT.head(A0),D1
  111.         CMP     KbdRecT.tail(A0),D1
  112.         BEQ     n
  113.         MOVE    #1,(A1)
  114.         ADDQ    #4,D1
  115.         CMP     KbdRecT.size(A0),D1
  116.         BCS     o
  117.         CLR     D1
  118.      o: MOVE    D1,KbdRecT.head(A0)
  119.         MOVE.L  KbdRecT.buf(A0),A1
  120.         MOVE.L  0(A1,D1.W),D0
  121.         JMP     asn
  122.      n: CLR.L   (A2)
  123.         CLR     (A1)
  124.     END
  125.   END GetKey;
  126.  
  127. PROCEDURE put;
  128.   BEGIN
  129.     ASSEMBLER
  130.         MOVE.B  Key.ctrl(A2),D0
  131.         LSL     #1,D0
  132.         MOVE.B  D0,(A1)+
  133.         MOVE.B  Key.scan+1(A2),(A1)
  134.         MOVE.B  Key.ch(A2),2(A1)
  135.     END
  136.   END put;
  137.  
  138. PROCEDURE PushBackKey (VAR k: Key; VAR ok: BOOLEAN);
  139.   BEGIN
  140.     ASSEMBLER
  141.         MOVE.L  -(A3),A1        ; ok
  142.         MOVE.L  -(A3),A2        ; k
  143.         MOVE.L  KbdRec,A0
  144.         MOVE    KbdRecT.head(A0),D0
  145.         MOVE    D0,D1
  146.         SUBQ    #4,D0
  147.         BCC     o
  148.         MOVE    KbdRecT.size(A0),D0
  149.         SUBQ    #4,D0
  150.      o: CMP     KbdRecT.tail(A0),D0
  151.         BEQ     n
  152.         MOVE    D0,KbdRecT.head(A0)
  153.         MOVE    #1,(A1)
  154.         MOVE.L  KbdRecT.buf(A0),A1
  155.         ADDA.W  D1,A1
  156.         JMP     put
  157.      n: CLR     (A1)
  158.      e:
  159.     END
  160.   END PushBackKey;
  161.  
  162. PROCEDURE PutKey (VAR k: Key; VAR ok: BOOLEAN);
  163.   BEGIN
  164.     ASSEMBLER
  165.         MOVE.L  -(A3),A1        ; ok
  166.         MOVE.L  -(A3),A2        ; k
  167.         MOVE.L  KbdRec,A0
  168.         MOVE    KbdRecT.tail(A0),D0
  169.         ADDQ    #4,D0
  170.         CMP     KbdRecT.size(A0),D0
  171.         BCS     o
  172.         CLR     D0
  173.      o: CMP     KbdRecT.head(A0),D0
  174.         BEQ     n
  175.         MOVE    #1,(A1)
  176.         MOVE    D0,KbdRecT.tail(A0)
  177.         MOVE.L  KbdRecT.buf(A0),A1
  178.         ADDA.W  D0,A1
  179.         JMP     put
  180.      n: CLR     (A1)
  181.     END
  182.   END PutKey;
  183.  
  184. PROCEDURE ClrKeyBuffer;
  185.   BEGIN
  186.     ASSEMBLER
  187.         MOVE.L  KbdRec,A0
  188.         MOVE    KbdRecT.tail(A0),KbdRecT.head(A0)
  189.     END
  190.   END ClrKeyBuffer;
  191.  
  192. PROCEDURE LockKeyBuffer (VAR hdl: LONGCARD);
  193.   BEGIN
  194.     ASSEMBLER
  195.         SUBQ.L  #4,A7
  196.         MOVE.L  A7,(A3)+
  197.         JSR     EnterSupervisorMode
  198.         MOVE.L  -(A3),A0
  199.         MOVE    SR,(A0)
  200.         ORI     #$0700,SR
  201.         MOVE.L  A7,(A3)+
  202.         JSR     LeaveSupervisorMode
  203.         ADDQ.L  #4,A7
  204.     END
  205.   END LockKeyBuffer;
  206.  
  207. PROCEDURE UnlockKeyBuffer (hdl: LONGCARD);
  208.   BEGIN
  209.     ASSEMBLER
  210.         SUBQ.L  #4,A7
  211.         MOVE.L  A7,(A3)+
  212.         JSR     EnterSupervisorMode
  213.         SUBQ.L  #2,A3
  214.         MOVE    -(A3),SR
  215.         MOVE.L  A7,(A3)+
  216.         JSR     LeaveSupervisorMode
  217.         ADDQ.L  #4,A7
  218.     END
  219.   END UnlockKeyBuffer;
  220.  
  221. PROCEDURE SetExtMode ( VAR lastMode: BOOLEAN );
  222.   BEGIN
  223.     ASSEMBLER
  224.         SUBQ.L  #4,A7
  225.         JSR     ToSuper
  226.         BSET    #3,$484
  227.         SNE     D0
  228.         ANDI    #1,D0
  229.         MOVE.L  -(A3),A0
  230.         MOVE    D0,(A0)
  231.         JSR     ToUser
  232.         ADDQ.L  #4,A7
  233.     END
  234.   END SetExtMode;
  235.  
  236. PROCEDURE CurrentMode (): BOOLEAN;
  237.   BEGIN
  238.     ASSEMBLER
  239.         SUBQ.L  #4,A7
  240.         JSR     ToSuper
  241.         BTST    #3,$484
  242.         SNE     D0
  243.         ANDI    #1,D0
  244.         MOVE    D0,(A3)+
  245.         JSR     ToUser
  246.         ADDQ.L  #4,A7
  247.     END
  248.   END CurrentMode;
  249.  
  250. PROCEDURE SetMode ( extended: BOOLEAN );
  251.   BEGIN
  252.     ASSEMBLER
  253.         SUBQ.L  #4,A7
  254.         JSR     ToSuper
  255.         TST     -(A3)
  256.         BNE     setit
  257.         BCLR    #3,$484
  258.         BRA     ret
  259.   setit BSET    #3,$484
  260.   ret:  JSR     ToUser
  261.         ADDQ.L  #4,A7
  262.     END
  263.   END SetMode;
  264.  
  265. PROCEDURE removal;
  266.   BEGIN
  267.     ASSEMBLER
  268.         MOVE    PreviousMode,(A3)+
  269.         JMP     SetMode
  270.     END
  271.   END removal;
  272.  
  273. VAR wsp: MemArea;
  274.  
  275. BEGIN
  276.   ASSEMBLER
  277.         ; I/O-Buffer f. Tastatur ermitteln
  278.         MOVE    #1,-(A7)
  279.         MOVE    #14,-(A7)
  280.         TRAP    #14         ; iorec (kbd)
  281.         ADDQ.L  #4,A7
  282.         MOVE.L  D0,KbdRec
  283.   END;
  284.   SetExtMode (PreviousMode);
  285.   CatchRemoval (remc, removal, wsp);
  286. END KbdCtrl.
  287. ə
  288. (* $00001109$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$000002C6$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2F$FFF6BC2FÇ$00001907T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$00001932$00000281$000018E4$00001907$00001614$FFEFB5B0$00001774$000016BB$000017FD$000017C8$00001691$00001744$FFEFB5B0$00001892$0000189B$000017D2ÉÇÇ*)
  289.